
package com.udc.medLine.transaction;

import java.util.List;

import com.udc.medLine.entity.Laboratorio;
import com.udc.medLine.entity.CondicaoVO;
import com.udc.medLine.entity.Medicamento;
import com.udc.medLine.entity.PrincipioAtivo;
import com.udc.medLine.factory.FactoryLaboratorio;
import com.udc.medLine.factory.FactoryMedicamento;
import com.udc.medLine.factory.FactoryPrincipioAtivo;
import com.udc.medLine.persistence.Bd;

public class TransactionMedicamento {

	private Medicamento medicamento;
	private PrincipioAtivo principioAtivo;
	private Laboratorio laboratorio;
	private List listMedicamento;
	private List principioAtivos;

	private List laboratorios;
	private Bd banco;
	
	/**
	 * 
	 */
	public TransactionMedicamento() {
		super();
		medicamento = new Medicamento();
		principioAtivo = new PrincipioAtivo();
		laboratorio = new Laboratorio();
		try{
			banco = Bd.getInstance();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		// TODO Stub de construtor gerado automaticamente
	}

	public Medicamento getMedicamento() {
		return medicamento;
	}

	public void setMedicamento(Medicamento new_medicamento) {
		this.medicamento = new_medicamento;
	}

	public void remover(Medicamento nMedicamento) throws Exception {
		banco.beginTransaction();
			FactoryMedicamento factory = new FactoryMedicamento();
			medicamento.setId(nMedicamento.getId());
			factory.setMedicamento(medicamento);
			factory.setMedicamento(factory.obterMedicamento());
			factory.delete();
		banco.commit();
	}

	public void inserir(Medicamento nMedicamento) throws Exception {
		banco.beginTransaction();
			FactoryMedicamento factory = new FactoryMedicamento();
			FactoryPrincipioAtivo factoryPrincipioAtivo = new FactoryPrincipioAtivo();
			FactoryLaboratorio factoryLaboratorio = new FactoryLaboratorio();
			
			laboratorio.setId(nMedicamento.getLaboratorio().getId());
			factoryLaboratorio.setLaboratorio(laboratorio);
			laboratorio = factoryLaboratorio.obterLaboratorio();
			
			principioAtivo.setId(nMedicamento.getPrincipioAtivo().getId());
			factoryPrincipioAtivo.setPrincipioAtivo(principioAtivo);
			principioAtivo = factoryPrincipioAtivo.obterPrincipioAtivo();
			
			medicamento.setNome(nMedicamento.getNome());
			medicamento.setDataVencimento(nMedicamento.getDataVencimento());
			medicamento.setPrecoCusto(nMedicamento.getPrecoCusto());
			medicamento.setPrecoVenda(nMedicamento.getPrecoVenda());
			medicamento.setQuantidade(nMedicamento.getQuantidade());
			medicamento.setQuantidadeMinima(nMedicamento.getQuantidadeMinima());

			
			medicamento.setLaboratorio(laboratorio);
			medicamento.setPrincipioAtivo(principioAtivo);
			
			factory.setMedicamento(medicamento);
			factory.insert();
		banco.commit();
	}

	public void atualizar(Medicamento nMedicamento) throws Exception {
		banco.beginTransaction();
		FactoryMedicamento factory = new FactoryMedicamento();
		FactoryPrincipioAtivo factoryPrincipioAtivo = new FactoryPrincipioAtivo();
		FactoryLaboratorio factoryLaboratorio = new FactoryLaboratorio();
		
		laboratorio.setId(nMedicamento.getLaboratorio().getId());
		factoryLaboratorio.setLaboratorio(laboratorio);
		laboratorio = factoryLaboratorio.obterLaboratorio();
		
		principioAtivo.setId(nMedicamento.getPrincipioAtivo().getId());
		factoryPrincipioAtivo.setPrincipioAtivo(principioAtivo);
		principioAtivo = factoryPrincipioAtivo.obterPrincipioAtivo();
		
		medicamento.setId(nMedicamento.getId());
		medicamento.setNome(nMedicamento.getNome());
		medicamento.setDataVencimento(nMedicamento.getDataVencimento());
		medicamento.setPrecoCusto(nMedicamento.getPrecoCusto());
		medicamento.setPrecoVenda(nMedicamento.getPrecoVenda());
		medicamento.setQuantidade(nMedicamento.getQuantidade());
		medicamento.setQuantidadeMinima(nMedicamento.getQuantidadeMinima());
		medicamento.setLaboratorio(laboratorio);
		medicamento.setPrincipioAtivo(principioAtivo);
		
		factory.setMedicamento(medicamento);
			factory.update();
		banco.commit();
	}


	public void obterMedicamento(String campo, String valor) throws Exception{
		banco.beginTransaction();
			FactoryMedicamento factory = new FactoryMedicamento();
			factory.setMedicamento(new Medicamento());
			listMedicamento = factory.getMedicamento(campo,valor);
		banco.commit();
	}
	
	public void obterListaMedicamento() throws Exception{
		banco.beginTransaction();
			FactoryMedicamento factory = new FactoryMedicamento();
			factory.setMedicamento(new Medicamento());
			listMedicamento = factory.getListaMedicamento();
		banco.commit();
	}
	
	public void obterMedicamento(Medicamento nMedicamento) throws Exception{
		banco.beginTransaction();
			FactoryMedicamento factory = new FactoryMedicamento();
			medicamento.setId(nMedicamento.getId());
			factory.setMedicamento(medicamento);
			medicamento = factory.obterMedicamento();
		banco.commit();
	}
	
	public List search(List condicoes) throws Exception{
		banco.beginTransaction();
			FactoryMedicamento factory = new FactoryMedicamento();
			factory.setMedicamento(new Medicamento());
			listMedicamento = factory.search(condicoes);			 
		banco.commit();
		return listMedicamento;		
	}
	
	public void obterListaLaboratorio() throws Exception{
		banco.beginTransaction();
			FactoryLaboratorio factory = new FactoryLaboratorio();
			laboratorios = factory.getListaLaboratorio();
		banco.commit();
	}
	
	public void obterListaPrincipioAtivo() throws Exception{
		banco.beginTransaction();
			FactoryPrincipioAtivo factory = new FactoryPrincipioAtivo();
			principioAtivos = factory.getListaPrincipioAtivo();
		banco.commit();
	}
	
	/**
	 * @return
	 */
	public List getListMedicamento() {
		return listMedicamento;
	}

	/**
	 * @param list
	 */
	public void setListMedicamento(List list) {
		listMedicamento = list;
	}
	/**
	 * @return the principioAtivo
	 */
	public PrincipioAtivo getPrincipioAtivo() {
		return principioAtivo;
	}

	/**
	 * @param principioAtivo the principioAtivo to set
	 */
	public void setPrincipioAtivo(PrincipioAtivo principioAtivo) {
		this.principioAtivo = principioAtivo;
	}

	/**
	 * @return the laboratorio
	 */
	public Laboratorio getLaboratorio() {
		return laboratorio;
	}

	/**
	 * @param laboratorio the laboratorio to set
	 */
	public void setLaboratorio(Laboratorio laboratorio) {
		this.laboratorio = laboratorio;
	}

	/**
	 * @return the principioAtivos
	 */
	public List getPrincipioAtivos() {
		return principioAtivos;
	}

	/**
	 * @param principioAtivos the principioAtivos to set
	 */
	public void setPrincipioAtivos(List principioAtivos) {
		this.principioAtivos = principioAtivos;
	}

	/**
	 * @return the laboratorios
	 */
	public List getLaboratorios() {
		return laboratorios;
	}

	/**
	 * @param laboratorios the laboratorios to set
	 */
	public void setLaboratorios(List laboratorios) {
		this.laboratorios = laboratorios;
	}

	public List<Medicamento> search(CondicaoVO condicao) throws Exception {
		banco.beginTransaction();
		FactoryMedicamento factory = new FactoryMedicamento();
		listMedicamento = factory.search(condicao);
		banco.commit();
		return listMedicamento;
	}

}
